home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 363 / tprolog1 / editor < prev    next >
Text File  |  1990-02-03  |  4KB  |  109 lines

  1.  
  2. % Editor for TOY Prolog
  3. % (c) 1983 Kluzniak/Szpakowicz, IIUW Warszawa
  4.  
  5. edit( Name/Arity ) :- not ( atom( Name ), integer( Arity ) ), !,
  6.       write( 'Bad parameters : ' ),
  7.       write( edit( Name/Arity ) ), nl, fail.
  8. edit( Name/Arity ) :- predefined( Name, Arity ), !,
  9.       write( 'Can''t edit system routine : ' ),
  10.       write( Name/Arity ), nl, fail.
  11. edit( NameArity ) :- tag( ed( NameArity, 0 ) ).
  12.  
  13. ed( NameArity, Cursor ) :- show( NameArity, Cursor ), !,
  14.       docmd( NameArity, Cursor, NewCursor ),
  15.       ed( NameArity, NewCursor ).
  16. ed( NameArity, Cursor ) :- display( 'Cursor out of range : ' ),
  17.       display( Cursor ), nl, ed( NameArity, 0 ).
  18.  
  19. docmd( NameArity, Cursor, NewCursor ) :-
  20.       repeat,
  21.          getline( Line ), cmd( Line, NameArity, Cursor, NewCursor ),
  22.       !.
  23.  
  24. getline( [] ) :- rch, lastch( C ), iseoln( C ), !.
  25. getline( [C | L] ) :- lastch( C ), getline( L ).
  26.  
  27. cmd( [], NmAr, Cur, NCur ) :- next_cursor( NmAr, Cur, NCur ).
  28. cmd( ['+'], NmAr, Cur, NCur ) :- next_cursor( NmAr, Cur, NCur ).
  29. cmd( ['-'], _, Cur, NCur ) :- prev_cursor( Cur, NCur ).
  30. cmd( [t], NmAr, _, 0 ).
  31. cmd( [b], NmAr, Cur, NCur ) :- bottom_cursor( NmAr, Cur, NCur ).
  32. cmd( [l], NmAr, Cur, Cur ) :- listing( NmAr ).
  33. cmd( [d], NmAr, Cur, NCur ) :- delete( NmAr, Cur, NCur ).
  34. cmd( [i], NmAr, Cur, NCur ) :- insert( NmAr, Cur, NCur ).
  35. cmd( [f, ' ' | NameString], NmAr, Cur, NCur ) :-
  36.       file_insert( NameString, NmAr, Cur, NCur ).
  37. cmd( [e, ' ' | Args], NmAr, Cur, NCur ) :-
  38.       append( NameString, ['/' | ArityString], Args ),
  39.       call_edit( NameString, ArityString ).
  40. cmd( [x], _, _, _ ) :- tagexit( ed( _, _ ) ).
  41. cmd( [p], NmAr, Cur, Cur ) :- invoke_Prolog.
  42. cmd( String, _, _, _ ) :- display( '--- incorrect command : ' ),
  43.       writetext( String ), nl, fail.
  44.  
  45. next_cursor( Name/Arity, Cursor, Next ) :-
  46.       Next is Cursor + 1, check( clause( Name, Arity, Next, _, _ ) ), !.
  47. next_cursor( _, Cursor, Cursor ).
  48.  
  49. prev_cursor( 0, 0 ).
  50. prev_cursor( Cursor, Prev ) :- Cursor > 0, Prev is Cursor - 1.
  51.  
  52. bottom_cursor( Name/Arity, Cursor, Bottom ) :-
  53.       Next is Cursor + 1, check( clause( Name, Arity, Next, _, _ ) ), !,
  54.       bottom_cursor( Name/Arity, Next, Bottom ).
  55. bottom_cursor( _, Cursor, Cursor ).
  56.  
  57. delete( _, 0, 0 ) :- !, display( 'Can''t delete clause 0' ), nl.
  58. delete( Name/Arity, Cursor, NewCursor ) :-
  59.       retract( Name, Arity, Cursor ),
  60.       cursor_in_range( Name, Arity, Cursor, NewCursor ).
  61.  
  62. cursor_in_range( Nm, Ar, Cur, Cur ) :- check( clause( Nm, Ar, Cur, _, _ ) ), !.
  63. cursor_in_range( _, _, Cur, Prev ) :- Prev is Cur - 1.
  64.  
  65. insert( NameArity, Cursor, NewCursor ) :-
  66.       repeat,
  67.          read( Clause ), convert( Clause, Head, Body ),
  68.          accept( Head, NameArity, Clause ),
  69.       !,
  70.       end_or_proceed( Head, Body, NameArity, Cursor, NewCursor ).
  71.  
  72. end_or_proceed( end, [], _, Cursor, Cursor ) :- !.
  73. end_or_proceed( Head, Body, NameArity, Cursor, NewCursor ) :-
  74.       Next is Cursor + 1, assert( Head, Body, Cursor ),
  75.       insert( NameArity, Next, NewCursor ).
  76.  
  77. accept( _, _, end ).
  78. accept( Head, Name/Arity, _ ) :- functor( Head, Name, Arity ).
  79. accept( _, _, Clause ) :-
  80.       display( '--- clause not in edited procedure - ignored' ),
  81.       nl, write( Clause ), fail.
  82.  
  83. file_insert( FNameString, NameArity, Cursor, NewCursor ) :-
  84.       pname( FileName, FNameString ),
  85.       see( FileName ), insert( NameArity, Cursor, NewCursor ),
  86.       seen, see( user ).
  87.  
  88. call_edit( NameString, ArityString ) :-
  89.       pname( Name, NameString ), pnamei( Arity, ArityString ),
  90.       edit( Name/Arity ).
  91.  
  92. invoke_Prolog :- tag( loop ).
  93. invoke_Prolog.
  94.  
  95. show( NameArity, 0 ) :- !, write( '[0] ( ' ), write( NameArity ),
  96.       write( ' )' ), nl.
  97. show( Name/Arity, Cursor ) :-
  98.       side_effects(  ( clause( Name, Arity, Cursor, Head, Body ),
  99.                      conv_body( NiceBody, Body ),
  100.                      display( '[' ), display( Cursor ), display( '] ' ),
  101.                      writeclause( Head, NiceBody ),
  102.                      display( '.' ), nl )  ).
  103.  
  104. append( [], L, L ).
  105. append( [E | L], L2, [E | LL2] ) :- append( L, L2, LL2 ).
  106.  
  107. end.
  108.  
  109.